package com.hwd.srb.core.controller.admin;


import com.alibaba.excel.EasyExcel;
import com.hwd.srb.common.constant.Constants;
import com.hwd.srb.common.exception.Assert;
import com.hwd.srb.common.exception.BusinessException;
import com.hwd.srb.common.result.R;
import com.hwd.srb.common.result.ResponseEnum;
import com.hwd.srb.common.constant.DictConstants;
import com.hwd.srb.core.pojo.dto.ExcelDictDTO;
import com.hwd.srb.core.pojo.entity.Dict;
import com.hwd.srb.core.service.DictService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;

/**
 * <p>
 * 数据字典 前端控制器
 * </p>
 *
 * @author 黄伟东/Victor
 * @since 2022-03-14
 */
@RestController
@RequestMapping("/admin/core/dict")
@ApiModel("后台管理数据字典接口")
@Api(tags = "数据字典管理")
@Slf4j
//@CrossOrigin
public class AdminDictController {

    @Resource
    private DictService dictService;

    /**
     * 根据数据字典上级id获取子节点数据列表
     *
     * @param parentId 上级节点id
     * @return com.hwd.srb.common.result.R
     */
    @GetMapping("/listByParentId/{parentId}")
    @ApiOperation("根据上级id获取子节点数据列表")
    public R listByParentId(@ApiParam(value = "上级节点id", required = true, example = "1")
                            @PathVariable("parentId") Long parentId) {

        // 调用业务层方法，执行查询
        List<Dict> dictList = dictService.listByParentId(parentId);

        // 断言数据字典列表不为空
        Assert.notNull(dictList, DictConstants.LIST_DICT_ERROR);

        return R.ok().message(DictConstants.LIST_DICT_SUCCESS).data(DictConstants.DICT_LISTS_KEY, dictList);
    }

    /**
     * 导出数据字典
     */
    @GetMapping("/export")
    @ApiOperation("导出Excel")
    public void export(HttpServletResponse response) {
        try {
            // 查询数据字典全部信息
            List<ExcelDictDTO> excelDictDTOList = dictService.listDictData();

            // 生成工作表名称（尚融宝数据字典）
            String sheetName = URLEncoder.encode(DictConstants.SHEET_NAME, Constants.UTF8);

            // 通过输出流进行文件下载，设置响应编码格式，下载的媒体类型，和头
            response.setCharacterEncoding(Constants.UTF8);
            response.setContentType(DictConstants.EXCEL_CONTENT_TYPE);
            response.setHeader(DictConstants.CONTENT_DISPOSITION_HEADER, DictConstants.CONTENT_DISPOSITION_FILENAME);

            // 调用easyExcel的写出方法，把全部数据字典信息以流导出
            EasyExcel.write(response.getOutputStream(), ExcelDictDTO.class).sheet(sheetName).doWrite(excelDictDTOList);

        } catch (IOException e) {
            log.error(DictConstants.EXPORT_ERROR);
            log.error("异常信息:{}", e.getMessage());
            e.printStackTrace();
            throw new BusinessException(ResponseEnum.EXPORT_DATA_ERROR);
        }
    }

    /**
     * 上传数据字典Excel文件
     *
     * @param multipartFile 文件对象
     */
    @PostMapping("/import")
    @ApiOperation("上传Excel")
    public R batchImport(@ApiParam(value = "上传的文件对象", required = true)
                         @RequestParam("file") MultipartFile multipartFile) {

        try {

            // 调用service业务层上传功能
            dictService.importData(multipartFile);
            return R.ok().message(DictConstants.IMPORT_SUCCESS);

        } catch (IOException e) {
            log.error(DictConstants.IMPORT_ERROR);
            log.error("异常信息:{}", e.getMessage());
            e.printStackTrace();
            throw new BusinessException(DictConstants.IMPORT_ERROR);
        }

    }
}

